In [1]:
%pylab inline
import matplotlib.pyplot as plt

from ipywidgets import *
Populating the interactive namespace from numpy and matplotlib

Kausztika. Miért csillog a Balaton vízfelszíne?

Kiegészítés: Cserti József: Kausztikák a fizikában

Lásd még: 2018. évi Ortvay verseny 18. feladata

In [2]:
def reflection(be,nn):
    '''
    be: a bejovo fenysugar iranyvektora (normalt)
    nn: a felulet normalvektora (normalt)
    r: a kimeno fenysugar iranyvektora (normalt)
    
    '''
    #be=be/sqrt((sum(be**2)))  # normalizing

    ki=be-2*nn*dot(be,nn)
    return(ki)
    

A felület alakja:

$y(x)=A*\sin(2\pi x/\lambda)$

A Balaton vízfelszínének egy modellje

In [3]:
def ref_rays(be,x0,param):
    '''
    a felulet fv: y(x)=A*sin(2\pi x/\lambda)
    
    '''
    A=1
    lam=20
    A,lam = param
    
    y0=A*sin(2*pi*x0/lam)
    der=A*2*pi/lam*cos(2*pi*x0/lam)
    nn=array([der,-1])    
    normal=nn/sqrt((sum(nn**2))) # normalizing
    
    ki=reflection(be,normal)
    
    return(y0,ki)
    
In [4]:
def gorbe(p,A,k,theta):
    '''
    a kausztika parameteres egyenlete, 'p' a parameter
    'theta' a fuggolegesen lefele mutato egysegvektor iranyanak szoge a fuggolegeshez kepest.
    
    '''
    
    xx1=(2 + A**2 * k**2 + A**2 *k**2 *cos(2*k* p))/sin(k*p)*(cos(theta)+A*k*cos(k* p)* sin(theta))
    xx2=2*A*k*cos(k* p)*cos(theta)-sin(theta)+A**2 * k**2 *(cos(k* p))**2 *sin(theta)
    nev=4*k**2 *(A+A**3 * k**2 *(cos(k* p))**2)
    xk=p + xx1*xx2/nev
    
    yy1=A*k*cos(k* p)*sin(theta)+cos(theta)
    yy2=(-1+A**2 * k**2 *(cos(k* p))**2)* cos(theta) -2* A*k*cos(k* p)* sin(theta)
    yk=A* sin(k* p) + (2+A**2 * k**2 + A**2 *k**2 *cos(2*k* p))/sin(k*p)*yy1*yy2/nev
    
    
    return(xk,yk)
In [5]:
def rajz_Balaton_kausztika_eq(A,k,theta):
    
    #A,k=(1,0.5)
    #alpha = 65*pi/180, itt  alpha= pi/2 -theta, theta a beesesi szog a fuggolegeshez merve

    Np=5000
    pmax=50
    pmin=-pmax
    p=linspace(pmin,pmax,Np)
    yfelszin=A*sin(k*p)
    p=linspace(pmin,pmax,Np)
    xk,yk=gorbe(p,A,k,theta)

    #figsize(12,12)
    #ax=subplot(aspect='equal')
    #ax=subplot(111)

    #plot(p,yfelszin, color='b')
    plot(xk,yk,'b.');

    #xlim(-15,15)
    #ylim(-15,15);
    #ax.set_axis_off();
    grid();
    
In [6]:
theta=10*pi/180
be=array([sin(theta),-cos(theta)])
#be=be/sqrt((sum(be**2)))  # normalizing

A,lam=(1,20)
param= (A,lam)

Np,xmin,xmax=(100,-15,45)
ymax=20*A       
    
xlist=linspace(xmin,xmax,Np)
ylist=A*sin(2*pi*xlist/lam)

figsize(12,8)
#ax=subplot(aspect='equal')
ax=subplot(111)


plot(xlist,ylist,color='k',lw=3)

benyil=0.25*ymax*be
arrow(lam/3,ymax,benyil[0],benyil[1], head_width=0.5, head_length=0.5, fc='b', ec='g',lw=7)

for x0 in xlist:
    y0,rr=ref_rays(be,x0,param)

    y1=ymax
    x1=x0+rr[0]/rr[1]*(y1-y0)

    plot([x0,x1],[y0,y1],color='r');
        
k=2*pi/lam
#theta = 10*pi/180
    
rajz_Balaton_kausztika_eq(A,k,theta)


xlim(xmin,xmax)
ylim(-2.5*A,ymax)
title('Visszavert fénysugarak (piros), bejövő (zöld)\n', fontsize=18);
#ax.set_axis_off();
In [14]:
def rajz_Balaton(theta,A,lam,Np,xmeret,ymax):
    
    theta=theta*pi/180
    be=array([sin(theta),-cos(theta)])
    #be=be/sqrt((sum(be**2)))  # normalizing

    #A,lam=(1,20)
    param= (A,lam)

    xmin,xmax = xmeret
    #xmin,xmax=(-15,45)
    #ymax=10*A
    
    xlist=linspace(xmin,xmax,Np)
    ylist=A*sin(2*pi*xlist/lam)

    figsize(10,6)
    #ax=subplot(aspect='equal')
    ax=subplot(111)

    plot(xlist,ylist,color='k',lw=3)

    benyil=0.25*ymax*be
    arrow(0,ymax,benyil[0],benyil[1], head_width=0.5, head_length=0.5, fc='b', ec='b',lw=7)

    for x0 in xlist:
        y0,rr=ref_rays(be,x0,param)

        y1=ymax
        x1=x0+rr[0]/rr[1]*(y1-y0)

        plot([x0,x1],[y0,y1],color='r');
        
    xlim(xmin,xmax)
    ylim(-1.5*A,ymax)
    title('Visszavert fénysugarak (piros), bejövő (kék)\n', fontsize=18);

    rajz_Balaton_kausztika_eq(A,k,theta)

    ax.set_axis_off();
In [15]:
xmeret=(-35,25)  # xmin,xmax,ymax
A,lam=(1,20)
              
@interact(theta=(-90,90,5),Np=(50,300,10),ymax=(10,100,10))
def play(theta=0,Np=100,ymax=25):
    
    rajz_Balaton(theta,A,lam,Np,xmeret,ymax)
    show();